#include <string.h>
#include <errno.h>
#include <asm/segment.h>

char msg[24]; //23个字符 +'\0' = 24

int sys_iam(const char * name)
/***
function：将name的内容拷贝到msg,name的长度不超过23个字符
return：拷贝的字符数。如果name的字符个数超过了23,则返回“­-1”,并置errno为EINVAL。
****/
{
    printk("iam in kernal\n");
	int i;
	//临时存储 输入字符串 操作失败时不影响msg
	char tmp[30];
	for(i=0; i<30; i++)
	{
		//从用户态内存取得数据
		tmp[i] = get_fs_byte(name+i);
		if(tmp[i] == '\0') break;  //字符串结束
	}
	//printk(tmp);
	i=0;
	while(i<30&&tmp[i]!='\0') i++;
	int len = i;
	// int len = strlen(tmp);
	//字符长度大于23个
	if(len > 23)
	{
		// printk("String too long!\n");
		return -(EINVAL);  //置errno为EINVAL  返回“­-1”  具体见_syscalln宏展开
	}
	strcpy(msg,tmp);
	//printk(tmp);
	return i;
}

int sys_whoami(char* name, unsigned int size)
/***
function:将msg拷贝到name指向的用户地址空间中,确保不会对name越界访存(name的大小由size说明)
return: 拷贝的字符数。如果size小于需要的空间,则返回“­-1”,并置errno为EINVAL。
****/
{ 	
	//msg的长度大于 size
	int len = 0;
	for(;msg[len]!='\0';len++);
	if(len > size)
	{
		return -(EINVAL);
	}
	int i = 0;
	//把msg 输出至 name
	for(i=0; i<size; i++)
	{
		put_fs_byte(msg[i],name+i);
		if(msg[i] == '\0') break; //字符串结束
	}
	return i;
}




// #define __LIBRARY__
// #include <errno.h>
// #include <string.h>
// //#include <unistd.h>
// #include <linux/kernel.h>
//#include <linux/sys.h>

//_syscall1(int,iam,const char*,name)
// int iam(const char* name)
// {
//     long __res;
//     printk("iam in kernal\n");
//     __asm__ volatile ("int $0x80"
//         : "=a" (__res)
//         : "0" (72),"b" ((long)(name)));
//     if (__res >= 0)
//         return (int) __res;
//     errno = -__res;
//     return -1;
// }
//_syscall2(int,whoami,char*, name,unsigned int,size)
// int whoami(char* name, int size)
// {
//     long __res;
//     printk("whoami in kernal\n");
//     __asm__ volatile ("int $0x80"
//         : "=a" (__res)
//         : "0" (73),"b" ((long)(name)),"c"((long)(size)));
//     if (__res >= 0)
//         return (int) __res;
//     errno = -__res;
//     return -1;
// }

// static char _name[23];
// static int _name_len = 0;

// int sys_iam(const char* name)
// {
//     printk("iam in kernal\n");
//     int i = 0;
//     const char *tmp = name;
//     while(*tmp != '\0') ++i;
//     if (i > 23)
//     {
//         errno = EINVAL;
//         return -1;
//     }
//     strcpy(_name, name);
//     return 0;
// }
// int sys_whoami(char* name, unsigned int size)
// {
//     printk("whoami in kernal\n");
//     if (size < _name_len)
//     {
//         errno = EINVAL;
//         return -1; 
//     }
//     strcpy(name, _name);
//     return 0;
// }


// iam.c
// #include <errno.h>
// #define __LIBRARY__
// #include <unistd.h>
// #include <stdio.h>
// int iam(const char* name)
// {
//     long __res;
//     __asm__ volatile ("int $0x80"
//         : "=a" (__res)
//         : "0" (72),"b" ((long)(name)));
//     if (__res >= 0)
//         return (int) __res;
//     errno = -__res;
//     return -1;
// }
// int main(int argc, char** argv)
// {
//     iam(argv[1]);
//     return 0;
// }


// whoami.c
// #include <errno.h>
// #define __LIBRARY__
// #include <unistd.h>
// #include <stdio.h>
// int whoami(char* name, int size)
// {
//     long __res;
//     __asm__ volatile ("int $0x80"
//         : "=a" (__res)
//         : "0" (73),"b" ((long)(name)),"c"((long)(size)));
//     if (__res >= 0)
//         return (int) __res;
//     errno = -__res;
//     return -1;
// }
// int main(void)
// {
//     char s[30] = "abc";
//     whoami(s, 30);
//     printf("%s\n", s);
//     return 0;
// }

